//
// Created by Administrator on 2021/9/27.
//

#ifndef HELLOOPENGL_GEOMETRY_H
#define HELLOOPENGL_GEOMETRY_H
#include <vector>
#include "Drawable.h"

class Geometry : public Drawable{
private:
    String ID;
protected:
    //绘制
    std::vector<float> vertex;
    std::vector<float> color;
    std::vector<float> uv;
    std::vector<float> normal;

    /**
     * 渲染模式
     */
    GLuint drawMode;

    //变换
    Matrix4x4 transform;

    virtual void setUpAttribute() = 0;

    /**
     * 计算旋转矩阵
     * @return todo 因为这里后期要加 四元素旋转，所以单独抽个方法
     */
    Matrix4x4 getRotationMatrix();
public:
    Vector3 * position;
    Vector3 * rotation;
    Vector3 * scale;

    std::vector<Geometry *> children;

public:
    Geometry();
    ~Geometry();

    String getId() const;

    void setDrawMode(DrawMode drawMode);

    /**
     * 基类实现基本初始化
     */
    void init() override;

    /**
     * 获得绑定的shader
     * @return
     */
    Shader getShader() override;

    /**
     * 基类实现基本绘画
     */
    void draw() override;


    // Transform
    /**
     * 获得模型变换矩阵
     * @return 模型变换矩阵
     */
    Matrix4x4 getModelmatrix();

    /**
    * 平移
    */
    void setTranslate(const Vector3& v);

    /**
     * 旋转
     */
    void setRotator(const Vector3& v);

    /**
     * 缩放
     */
    void setScale(const Vector3& v);
};

#endif //HELLOOPENGL_GEOMETRY_H
